const express = require("express")
const router = express.Router()
const jwt = require("jsonwebtoken")
const articleDB = require("../../db/article")
const fs = require("fs")
const path = require("path")
const adminDB = require("../../db/admin")

// 密钥
const cort = "coderxinxin2022-04-15"

// 鉴权是否具有修改权限
// 身份校验 检验是否具有发表权限
// router.use(async (req, res, next) => {
//   try {
//     // 校验token
//     // 获取请求头里面的token
//     let token = (req.headers.authorization || "").slice(7)
//     let info = null
//     // 捕获错误
//     try {
//       info = jwt.verify(token, cort)
//       const doc = await adminDB.findById(info._id)
//       // 检测超管身份
//       if (!doc.updatepower)
//         return res.send({
//           code: 4,
//           mes: "您不具有修改权限",
//         })
//       if (!doc)
//         return res.send({
//           code: 4,
//           mes: "系统检测到该账号已被注销",
//         })
//       // 检测密码是否更新
//       if (info.pass !== doc.pass)
//         return res.send({
//           code: 4,
//           mes: "密码已更新,请重新登录",
//         })
//       next()
//     } catch (error) {
//       console.log(error)
//       return res.send({
//         code: 4,
//         mes: "登录信息已过期,请重新登录",
//       })
//     }
//   } catch (error) {
//     res.send({
//       code: 5,
//       mes: "服务器异常，请稍后再试",
//     })
//   }
// })

// 修改文章是否可见
router.post("/updatepower", async (req, res) => {
  try {
    // 校验token
    // 获取请求头里面的token
    let token = (req.headers.authorization || "").slice(7)
    let info = null
    // 捕获错误
    try {
      info = jwt.verify(token, cort)
      const doc = await adminDB.findById(info._id)
      // 检测超管身份
      if (!doc.updatepower)
        return res.send({
          code: 4,
          mes: "您不具有修改权限",
        })
      if (!doc)
        return res.send({
          code: 4,
          mes: "系统检测到该账号已被注销",
        })
      // 检测密码是否更新
      if (info.pass !== doc.pass)
        return res.send({
          code: 4,
          mes: "密码已更新,请重新登录",
        })
    } catch (error) {
      console.log(error)
      return res.send({
        code: 4,
        mes: "登录信息已过期,请重新登录",
      })
    }

    const { articleID } = req.body
    // 查看文章是否存在
    const doc = await articleDB.findById(articleID)
    if (!doc)
      return res.send({
        code: 2,
        mes: "该文章已被删除，请刷新后重试",
      })
    await articleDB.findByIdAndUpdate(articleID, {
      isShow: !doc.isShow,
    })
    res.send({
      code: 0,
      mes: "修改成功",
    })
  } catch (error) {
    res.send({
      code: 5,
      mes: "服务器异常，请稍后再试",
    })
  }
})

// 修改文章内容
router.post("/updateInfo", async (req, res) => {
  try {
    // 校验token
    // 获取请求头里面的token
    let token = (req.headers.authorization || "").slice(7)
    let info = null
    let adminID = ""
    // 捕获错误
    try {
      info = jwt.verify(token, cort)
      const doc = await adminDB.findById(info._id)
      // 检测超管身份
      if (!doc.updatepower)
        return res.send({
          code: 4,
          mes: "您不具有修改权限",
        })
      if (!doc)
        return res.send({
          code: 4,
          mes: "系统检测到该账号已被注销",
        })
      // 检测密码是否更新
      if (info.pass !== doc.pass)
        return res.send({
          code: 4,
          mes: "密码已更新,请重新登录",
        })
      adminID = doc._id
    } catch (error) {
      console.log(error)
      return res.send({
        code: 4,
        mes: "登录信息已过期,请重新登录",
      })
    }

    const { articleID, title, des, cover, type, text } = req.body

    const doc = await articleDB.findById(articleID)
    if (!doc)
      return res.send({
        code: 2,
        mes: "该文章已被删除",
      })

    // 校验
    if (!title.trim() || !text.trim()) {
      return res.send({
        code: 2,
        mes: "请输入文章标题",
      })
    }
    if (type == "1" || type == "2") {
      if (!cover)
        return res.send({
          code: 2,
          mes: "请输入文章封面地址",
        })
    }

    // 生成文件名字
    let name = "/editor/" + adminID + Date.now() + ".md"
    // 存储文章 并且生成地址
    // 创建一个可以写入的流，写入到文件 output.txt 中
    var ws = fs.createWriteStream(path.join(__dirname, "../../static" + name))
    // 使用 utf8 编码写入数据
    ws.write(text)
    // 处理流事件 --> finish、error
    let time = null
    ws.once("finish", async function () {
      let nowTime = Date.now()
      if (nowTime - time > 2000) {
        time = nowTime
        // 删除旧的文章
        fs.rm(
          path.join(__dirname, `../../static${doc.textURL}`),
          { recursive: true },
          (err) => {}
        )
        // 更新新的文章
        await articleDB.findByIdAndUpdate(articleID, {
          title,
          des,
          cover,
          type: type * 1,
          textURL: name,
          updateTime: Date.now(),
        })
        res.send({
          code: 0,
          mes: "更新成功",
        })
      }
    })

    ws.once("error", function (err) {
      console.log(err.stack)
    })

    // 标记文件末尾
    ws.end()
  } catch (error) {
    console.log(error)
    res.send({
      code: 5,
      mes: "服务器异常，请稍后再试",
    })
  }
})

module.exports = router
